PritunlでVPCへのOpenVPN接続を用意する
こんにちは、ももんが大好きの小山です。みなさんいかがお過ごしでしょうか?
きょうは、米国企業の Pritunl, Inc. が提供するPritunlを使って、より安全に VPC 上のリソースへ接続できるようにする方法についてご紹介します。
準備
EC2 コンソールを開いて、Pritunl をセットアップしたい Amazon Linux インスタンスを起動します。サブネットはインターネットゲートウェイへのルートがあるもの、Public IP アドレスの Auto-assign は有効、IAMロールは「AmazonEC2RoleforSSMポリシー」を与えたものを選択して、User Data へ以下を貼り付けましょう。
#!/bin/bash cd /tmp curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm yum install -y amazon-ssm-agent.rpm tee -a /etc/yum.repos.d/mongodb-org-3.2.repo << EOF [mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc EOF tee -a /etc/yum.repos.d/pritunl.repo << EOF [pritunl] name=Pritunl Repository baseurl=https://repo.pritunl.com/stable/yum/centos/7/ gpgcheck=1 enabled=1 EOF gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 7568D9BB55FF9E5287D586017AE645C0CF8E292A gpg --armor --export 7568D9BB55FF9E5287D586017AE645C0CF8E292A > key.tmp; sudo rpm --import key.tmp; rm -f key.tmp yum -y install pritunl mongodb-org service mongod start start pritunl
注意: ハイライトした部分は、2017年2月23日現在で有効なものです。実際に使用する際は公式サイトから Amazon Linux を選択して最新の導入手順を確認することをおすすめします。
使用するセキュリティグループには、以下のようにインバウンドのHTTP (Anywhere)とHTTPS (My IP)を登録します。HTTP は Let's Encrypt からサーバ証明書を取得する際のドメイン確認のため、HTTPS は Pritunl の管理画面にアクセスするために必要です。実際の OpenVPN 接続で使用する UDP ポート番号はランダムに設定されるため、セキュリティグループへは Pritunl の設定が終わってから登録します。
必要なコンポーネントのセットアップが完了すると、以下のようにインスタンスのステータスチェックが緑色に変化します。これを確認したらインスタンスへ Elastic IP アドレスを与えて、所有するドメインのホスト (Aレコード) として登録しておきましょう。
Pritunlのセットアップ
インスタンスの用意ができたら、Pritunl の初期設定に必要なSetup Keyを取得します。EC2 コンソールのSystems Manager ServicesからRun Command、Run a Commandの順に選択します。以下の要領でAWS-RunShellScriptドキュメントを選択し、Pritunl インスタンスでpritunl setup-keyコマンドを実行します。
pritunl setup-key の実行に成功すれば、以下のようにステータスがSuccessに変化します。View Outputを選択しましょう。
Output では、以下のような文字列が表示されます。控えておきましょう。
Pritunl の初期設定を行うため、任意のブラウザでhttps://インスタンスのDNS名/を開きます。表示されたページでは、控えておいた文字列をEnter Setup Key欄に入力します。
以下のようなページが表示されたら、それぞれの欄にpritunlと入力して進みましょう。
Initial Setupでは、必要事項を入力してSaveを選択します。
以下のようなページが表示されたら初期設定は完了です。続いてUsersタブを選択しましょう。
Users タブでは、Organization と User を最低でも1つずつ作成します。
続いて Servers タブからAdd Serverを選択しましょう。Pritunl では、1つのインスタンスで複数の VPN サーバーをサービスすることができます。
続いて、作成したサーバーに Organization をアタッチします。Attach Organizationを選択しましょう。
VPN サーバーを複数作成して、作成した VPN サーバーに特定の Organization をアタッチすることでクライアントに割り当てる IP アドレスの CIDR を組織単位で変えることができます。
クライアントに割り当てる IP アドレスを組織単位で変えることはよいアイデアですが、Pritunl のFreeプランでは常に NAT が有効であることに注意してください。すべてのトラフィックは Pritunl インスタンスの IP アドレスで NAT が行われます。
一通り VPN サーバーと Organization のアタッチが済んだら、Start Serverボタンからサーバーを開始しましょう。続いてEC2 コンソールから Pritunl インスタンスで使用されるセキュリティグループを開き、それぞれの VPN サーバーに割り当てられた UDP ポートに対するトラフィックを許可します。
VPN クライアントからアクセスしたいリソースに設定されたセキュリティグループでは、Pritunl インスタンスのセキュリティグループ、もしくはプライベート IP アドレスからのトラフィックを許可しましょう。以上で準備は完了です! お疲れ様でした。
繋いでみる
OpenVPN のプロファイルを入手するため、管理画面のUsersタブから目的のユーザーを見つけてダウンロードボタンを選択します。
プロファイルが入手できたら、Pritunl Client の公式サイトからクライアントをインストールしましょう。Pritunl を起動すると、以下のような画面が表示されます。Import Profileからプロファイルをインポートしましょう。
プロファイルがインポートできたら、右上のメニューボタンからConnectを選択してユーザーの PIN を入力します。
無事に繋がりました!
きちんと VPC 内のインスタンスへも到達できています。
$ ping ip-10-145-140-9.eu-central-1.compute.internal PING ip-10-145-140-9.eu-central-1.compute.internal (10.145.140.9): 56 data bytes 64 bytes from 10.145.140.9: icmp_seq=0 ttl=127 time=29.118 ms 64 bytes from 10.145.140.9: icmp_seq=1 ttl=127 time=29.591 ms 64 bytes from 10.145.140.9: icmp_seq=2 ttl=127 time=29.028 ms 64 bytes from 10.145.140.9: icmp_seq=3 ttl=127 time=29.388 ms 64 bytes from 10.145.140.9: icmp_seq=4 ttl=127 time=28.996 ms ^C --- ip-10-145-140-9.eu-central-1.compute.internal ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 28.996/29.224/29.591/0.229 ms
VPC の DNS サービスを使った名前解決にも問題ありません。
$ nslookup ietf.org Server: 10.145.0.2 Address: 10.145.0.2#53 Non-authoritative answer: Name: ietf.org Address: 4.31.198.44
めでたしめでたし?
おわりに
いかがでしたか? 今回は、Pritunl の Free プランを使って VPC への基本的な OpenVPN 接続を実現する方法についてご紹介しました。Premium、Enterprise など他のプランでしか使うことのできない機能については次回ご紹介する予定です。どうぞご期待ください。
したっけまた!